package sortx

import (
	"codeup.aliyun.com/lsxd/zltx/adapter/utils/sortx/dict"
	"codeup.aliyun.com/lsxd/zltx/adapter/utils/sortx/order"
)

// Option 排序选项
type Option func(*options)

// Data 待签名数据，支持结构体和map类型，其他类型会返回空字典
func Data(data any) Option {
	return func(o *options) {
		o.data = data
	}
}

// SortMap 排序映射，自定义排序顺序
func SortMap(sortMap map[string]int) Option {
	return func(o *options) {
		o.sortMap = sortMap
	}
}

// OrderBy 排序规则
//
// Deprecated: Use Order instead.
func OrderBy(orderBy string) Option {
	return Order(order.FromString(orderBy))
}

// Order 排序规则
func Order(orderBy order.Order) Option {
	return func(o *options) {
		o.orderBy = orderBy
	}
}

// CustomFields 额外排序字段
func CustomFields(dict *dict.Dict) Option {
	return func(o *options) {
		o.fields = dict.List()
	}
}

// Tag 获取字段名的标签，默认是json标签，标签为空则使用字段名
func Tag(tag string) Option {
	return func(o *options) {
		o.tag = tag
	}
}

// options 排序选项
type options struct {
	// 待排序数据
	data any
	// 排序映射
	sortMap map[string]int
	// 排序规则
	orderBy order.Order
	// 额外排序字段
	fields []dict.KeyValue
	// 使用标签获取字段名
	tag string
}

func defaultOptions() *options {
	return &options{
		orderBy: order.Aes,
		tag:     "json",
	}
}

// Sort 排序
func Sort(opts ...Option) *dict.Dict {
	opt := defaultOptions()
	for _, o := range opts {
		o(opt)
	}

	kvs := dict.StructToDict(opt.data, opt.tag)
	// 额外排序字段
	if len(opt.fields) > 0 {
		kvs.Adds(opt.fields...)
	}

	// 如果排序映射存在，则使用自定义排序
	if opt.sortMap != nil {
		kvs.FixedSort(opt.sortMap)
		return kvs
	}

	// 否则使用默认/指定/自定义排序
	kvs.Sort(opt.orderBy)
	return kvs
}
